package com.xiaoqiang.commons.base.utils;

import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;

public class HexUtil {
    /**
     * 普通字符串转16进制字符串（默认采用UTF-8编码）
     *
     * @param source 原字符串
     * @return 得到的16进制字符串
     */
    public static String encodeToHex(String source) {
        return encodeToHex(source, StandardCharsets.UTF_8);
    }

    /**
     * 普通字符串转16进制字符串
     *
     * @param source  原字符串
     * @param charset 字符串编码
     * @return 得到的16进制字符串
     */
    public static String encodeToHex(String source, Charset charset) {
        return encodeToHex(source.getBytes(charset));
    }

    /**
     * 转为16进制字符串
     *
     * @param source 原byte数组
     * @return 得到的16进制字符串
     */
    public static String encodeToHex(byte[] source) {
        StringBuilder sb = new StringBuilder();
        for (byte b : source) {
            String hex = Integer.toHexString(b & 0xFF);
            if (hex.length() < 2) {
                sb.append("0");
            }
            sb.append(hex);
        }
        return sb.toString();
    }

    /**
     * 16进制字符串转byte数组
     *
     * @param hex 原16进制字符串
     * @return 得到的byte数组
     */
    public static byte[] decodeBytesFromHex(String hex) {
        int hexLen = hex.length();
        byte[] result;
        if (hexLen % 2 == 1) {
            hexLen++;
            hex = "0" + hex;
        }

        result = new byte[hexLen / 2];
        for (int i = 0, j = 0; i < result.length; i++, j += 2) {
            result[i] = (byte) Integer.parseInt(hex.substring(j, j + 2), 16);
        }
        return result;
    }

    /**
     * 16进制字符串转普通字符串
     *
     * @param hex 原16进制字符串
     * @return 生成的普通字符串
     */
    public static String decodeStringFromHex(String hex) {
        return new String(decodeBytesFromHex(hex), StandardCharsets.UTF_8);
    }
}
